/*
 * This file is part of Annuaire.
 *
 * Annuaire is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Annuaire is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with Annuaire.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.miage.annuaire.data;

import java.util.List;

import org.miage.annuaire.Membre;
import org.miage.annuaire.Structure;

/**
 * Cette interface permet de récupérer les données de l'annuaire sous forme
 * d'objets Java.
 * @author guhumber
 */
public interface ObjectDataAccess {

	/**
	 * Renvoie la liste de toutes les structures de l'annuaire. La liste
	 * renvoyée contient les structures du premier niveau. Pour accéder aux
	 * niveaux inférieurs, il faut appeler la méthode getChilds() d'une
	 * structure.
	 * @return La liste des structures du premier niveau.
	 */
	public List<Structure> getAllStructures();
	
    /**
	 * Renvoie la liste de toutes les structures de l'annuaire. La liste
	 * renvoyée contient les structures du premier niveau. Pour accéder aux
	 * niveaux inférieurs, il faut appeler la méthode getChilds() d'une
	 * structure.
	 * @return La liste des structures du premier niveau.
	 */
	public List<Structure> getCompleteStructures();

	/**
	 * Construit un objet structure à partir de sa clef.
	 * @param key Une clef de structure.
	 * @return Un objet structure construit. On a pas les informations sur la
	 * structure père ni sur les filles.
	 */
	public Structure getStructureByKey(String key);
	
	/**
	 * Renvoie une liste de membres. La recherche est faite à la fois sur le
	 * nom, la fonction et la structure.
	 * @param name Un nom de membre.
	 * @param function La fonction à rechercher.
	 * @param structure La structure à laquelle le membre doit appartenir.
	 * @return Une liste de membres.
	 */
	public List<Membre> getMembres(String name, String function,
			String structure);
	
	/**
	 * Renvoie une liste de membres en recherchant par leur nom. La recherche ne
	 * tient pas compte de la casse. Si le nom est une chaîne vide ou null,
	 * tous les membres sont renvoyés. Exemple: soit deux membres "TOTO" et
	 * "TATA". Si on recherche "toT", on aura "TOTO". Si on recherche "t" ou ""
	 * ou null, on aura "TOTO" et "TATA".
	 * @param name Le nom (ou la partie du nom) du membre à rechercher.
	 * @return Une liste de membres.
	 */
	public List<Membre> getMembresByName(String name);


	/**
	 * Renvoie une liste de membres en recherchant par leur function. La
	 * recherche ne tient pas compte de la casse. Si la fonction est une chaîne
	 * vide ou null, tous les membres sont renvoyés. Exemple: soit deux membres
	 * "service paie" et "vice-president". Si on recherche "vice", on aura
	 * "service paie " et " vice-president".
	 * @param function La fonction (ou la partie de la fonction) du membre à
	 * rechercher.
	 * @return Une liste de membres.
	 */
	public List<Membre> getMembresByFunction(String function);

	/**
	 * Renvoie une liste de membres en recherchant par leur function. La
	 * recherche ne tient pas compte de la casse. Si la fonction est une chaîne
	 * vide ou null, tous les membres sont renvoyés. Exemple: soit deux membres
	 * "service paie" et "vice-president". Si on recherche "vice", on aura
	 * "service paie " et " vice-president".
	 * @param structure La fonction (ou la partie de la fonction) du membre à
	 * rechercher.
	 * @return Une liste de membres.
	 */
	public List<Membre> getMembresByStructure(String structure);

        public List<Membre> getMembresByNameWithFonction(String name, List<Membre> LaList);
        
}
